# 字符串编码
# 本质上是二进制数据与语言文字的一一对应关系
# Unicode: 所有字符都是两个字节
# 优点: 速度快
# 坏处: 占用空间大
# UTF-8: 不定长字符编码，精准
# 优点: 节省空间
# 缺点: 转换速度慢，每个字符都要计算
#

# 编码: encode()
# 将其他编码的字符串转换成Unicode编码。
# 解码: decode()
# 将Unicode编码转换成其他编码的字符串。

# a = "hello"
# print(a, type(a)) # str, 字符串以字符为单位进行处理
#
# a1 = a.encode()
# print(a1, type(a1)) # bytes, 以字节为单位进行处理
#
# a2 = a1.decode()
# print(a2, type(a2)) # str

# str = "hello world"
# str1 = str.encode('utf-8')
# print(str1, type(str1))
# str2 = str1.decode('utf-8')
# print(str2, type(str2))

# ===========================================================

# 字符串常见操作：
# 1. 字符串拼接：+
# print(10+10)
# print("10"+"10")
# name1 = 'zhangsan'
# name2 = 'lisi'
# print(name1 + name2)

# 2. 重复输出：*
# print("hello world\n" * 10)
# print("&\t" * 10)

# 成员运算符
# 作用：检查字符串中是否包含了某个子字符串
# in : 如果包含, 返回True; 不包含, 返回False
# not in : 如果不包含, 返回True; 包含, 返回False
# name = "zhangsan"
# print('ang' in name) #True
# print('len' in name)
# print('b' in name)
# print('Z' in name)
# print('not' not in name)
#
# name1 = '张三'
# print('三' in name1)

# --------------------------------------------------------

# 下标
# Python中下标从 0 开始
# 作用：通过下标快速找到对应数据
# 格式：字符串名[下标值]
# name = 'zhangsan'
# # 从左向右数：从 0 开始
# print(name[0])
# print(name[1])
# print(name[2])
# # print(name[13]) #string index out of range
# # 从右往左数：从 -1 开始
# print(name[-3])
# print(name[-8])


# 3. 切片：
# 含义：指对操作的对象截取其中一部分的操作
# 语法：[开始位置 : 结束位置 : 步长]
# 包前不包后原则: 从起始位置开始，到结束位置的前一位结束（不包含结束位置本身）

# str = "abcdefghijklmn"

#从左往右：
# print(str[0:4])
# print(str[4:7])
# print(str[7:]) # 下标及之后的全部截取
# print(str[:6]) # 下标之前的全部截取

#从右往左：
# print(str[-1:]) # n
# print(str[:-1])
# print(str[-5:-1])

# 步长：表示选取间隔，默认是1
# 步长的绝对值大小决定切取的间隔，正负号决定切取方向
# 正号：从左往右    负号：从右往左

# print(str[-1:-5:-1])
# print(str[-1::-1])
# print(str[0:8:2])

# --------------------------------------------------------
# 4. 查找
# 4.1
# find(): 检测某个子字符串是否包含在字符串中，如果在就返回这个子字符串开始位置的下标，否则返回-1
# find(子字符串, 开始（查找）位置下标, 结束（查找）位置下标) --> 包前不包后
# 注意：开始和结束位置下标可以省略，表示在整个字符串中查找
# name = 'zhengchenggong'
# print(name.find('e'))
# print(name.find('ch'))
# print(name.find('a'))
# print(name.find('e',4,9))
# print(name.find('e',1,2)) # 包前不包后

# 4.2
# index(): 检测某个子字符串是否包含在字符串中，如果在就返回这个子字符串开始位置的下标，否则报错
# index(子字符串, 开始位置下标, 结束位置下标)  --> 包前不包后
# 注意：开始和结束位置下标可以省略，表示在整个字符串中查找
# word = '我们以为不用填'
# # print(word.index('地'))
# print(word.index('为'))
# print(word.index('不', 3, 5))

# 4.3
# count(): 返回某个子字符串在整个字符串中出现的次数，没有就返回 0
# count(子字符串, 开始位置下标, 结束位置下标)  --> 包前不包后
# 注意：开始和结束位置下标可以省略，表示在整个字符串中查找
# name = 'haerbinligongshshshdaxue'
# print(name.count('h')) # 4
# print(name.count('g')) # 2
# print(name.count('e')) # 2
# print(name.count('h',10, 20 )) # 3


# ===============================================================

#其他常见操作：（部分）
# 1. startswith():  判断是否以某个子字符串开头，是的话返回True，不是的话返回False，
#                   如果设置开始和结束位置，则在指定范围内检查。
# startswith(子字符串, 开始位置下标, 结束位置下标)
# str = 'yishanyishanljj'
# print(str.startswith('y'))
# print(str.startswith('yi'))
# print(str.startswith('sh'))
# print(str.startswith('sh', 2))
# print(str.startswith('sh', 2, 8))


# 2. endswith(): 判断是否以某个子字符串结尾，是的话返回True，不是的话返回False，
#                如果设置开始和结束位置，则在指定范围内检查。
# endswith(子字符串, 开始位置下标, 结束位置下标)  --> 包前不包后
# str = 'yishanyishanljj'
# print(str.endswith('jj'))
# print(str.endswith('yi', 2, 8))
# print(str.endswith('yi', 2, 7))


# 3. isupper(): 检测字符串中所有的字母是否都是大写，是的话返回True，否则返回False
#    islower(): 检测字符串中所有的字母是否都是小写，是的话返回True，否则返回False
# str = 'ubuntu'
# print(str.isupper())
# print('SIX'.isupper())
# print(str.islower())

# =================================================================
# 5. 修改元素
# 5.1 replace(): 替换
# replace(旧内容, 新内容, 替换次数) --> 原内容没有被修改
# 注意：替换次数可以省略，默认全部替换
# str = "goodgoodstudy daydayup"
# print(str.replace(" ", ", "))
# print(str)
# print(str.replace('good', 'great', 1))
# print(str)

# 5.2 split(): 指定分隔符来切割字符串
# str = 'hello,world'
# print(str.split(',')) # ['hello', 'world'] --> 以列表形式返回
# # 如果字符串中不包含分割内容，就不进行分割，会作为一个整体
# print(str.split('o'))
# print(str.split('o',1)) # 指定只分割一次


# 5.3 capitalize():  第一个字符大写，其他都小写
# str = "zhangSan"
# print(str.capitalize())

# 5.4 lower(): 大写字母转为小写
# str = "HelloWorld"
# print(str.lower())


# 5.5 upper(): 小写字母转为大写
# str = "hello"
# print(str.upper())
